package com.edev.support.ddd;

import com.edev.support.dao.impl.QueryDaoMybatisImpl;
import com.edev.support.entity.Entity;
import lombok.Getter;
import lombok.NonNull;
import lombok.Setter;
import org.springframework.beans.factory.annotation.Autowired;

import java.io.Serializable;
import java.util.Collection;
import java.util.Map;

/**
 * DDD架构下用MyBatis进行查询的实现类
 * <p>
 * 核心功能：
 * 1. 将MyBatis查询结果转换为领域实体集合
 * 2. 集成DDD工厂进行结果集转换
 * 3. 支持领域实体类的动态配置
 * <p>
 * 典型使用场景：
 * - 复杂条件查询映射到领域模型
 * - 数据库行数据到实体对象的批量转换
 * - 与Repository模式配合实现领域层查询
 */
public class QueryDaoMybastisImplForDdd extends QueryDaoMybatisImpl {
    @Autowired
    private DddFactory dddFactory;
    @Getter @Setter
    private String entityClass;
    /**
     * 构造方法（在Spring的配置类中驱动初始化）
     * <p>
     * 使用示例：
     * new QueryDaoMybastisImplForDdd("com.edev.trade.Order", "orderMapper.queryOrders")
     * @param entityClass 领域实体类全限定名（示例：com.edev.trade.Order）
     * @param sqlMapper MyBatis映射器ID（示例：orderMapper.queryOrders）
     */
    public QueryDaoMybastisImplForDdd(@NonNull String entityClass, @NonNull String sqlMapper) {
        super(sqlMapper);
        this.entityClass = entityClass;
    }

    /**
     * 执行查询并将结果集转换为领域实体集合
     * <p>
     * 处理流程：
     * 1. 调用父类执行原始查询
     * 2. 通过DDD工厂将结果集转换为实体对象
     * <p>
     * 使用示例：
     * Map<String,Object> params = new HashMap<>();
     * params.put("status", "ACTIVE");
     * Collection<Order> orders = dao.query(params);
     * 
     * @param params 查询参数（支持MyBatis动态条件）
     * @return 领域实体对象集合（自动转换后的结果）
     */
    @Override
    public Collection<? extends Entity<? extends Serializable>> 
        query(Map<String, Object> params) {
        @SuppressWarnings("unchecked")
        Collection<Map<String, Object>> collection = 
            (Collection<Map<String, Object>>) super.query(params);
        return dddFactory.createEntityByRowForList(entityClass, collection);
    }
}
